﻿#include "main.h"

// 全局变量
显卡管理器* g_显卡管理器 = nullptr;
显卡设备* g_显卡设备 = nullptr;
HWND g_hWnd = nullptr;

// 窗口过程
LRESULT CALLBACK 窗口过程(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
            DestroyWindow(hWnd);
        return 0;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

// 初始化窗口
bool 初始化窗口(HINSTANCE hInstance, int nCmdShow) {
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, 窗口过程, 0, 0,
                      hInstance, nullptr, LoadCursor(nullptr, IDC_ARROW),
                      (HBRUSH)COLOR_WINDOW, nullptr, L"测试窗口类", nullptr };

    if (!RegisterClassEx(&wc)) return false;

    g_hWnd = CreateWindow(wc.lpszClassName, L"中文DX测试",
                          WS_OVERLAPPEDWINDOW, 100, 100, 800, 600,
                          nullptr, nullptr, hInstance, nullptr);

    if (!g_hWnd) return false;

    ShowWindow(g_hWnd, nCmdShow);
    UpdateWindow(g_hWnd);
    return true;
}

bool 初始化DX() {
    // 创建显卡管理器
    g_显卡管理器 = 创建显卡管理器(D3D_开发包版本号);
    if (!g_显卡管理器) return false;

    // 设备参数配置 - 需要完整初始化所有必要字段
    呈现参数 参数;
    ZeroMemory(&参数, sizeof(呈现参数)); // 确保所有字段初始化为0
    参数.后台缓冲宽度 = 0;          // 0表示使用窗口大小
    参数.后台缓冲高度 = 0;
    参数.后台缓冲格式 = 未知格式;    // D3DFMT_UNKNOWN
    参数.后台缓冲数量 = 1;
    参数.多重采样类型 = 无多重采样; // D3DMULTISAMPLE_NONE
    参数.多重采样质量 = 0;
    参数.交换效果 = 立即丢弃后台缓冲; // D3DSWAPEFFECT_DISCARD
    参数.设备窗口句柄 = g_hWnd;     // 确保窗口句柄设置
    参数.窗口模式 = TRUE;           // 窗口模式
    参数.自动管理深度模板缓冲 = FALSE; // 不需要深度缓冲
    参数.自动深度模板格式 = 未知格式;
    参数.标志位 = 0;
    参数.全屏刷新率 = 0;
    参数.呈现间隔 = 呈现间隔_立即模式;      // D3DPRESENT_INTERVAL_IMMEDIATE

    // 创建设备
    HRESULT hr = g_显卡管理器->创建设备(
        默认适配器, 
        硬件设备, 
        g_hWnd,                   // 再次传入窗口句柄
        创建标志_硬件顶点处理,
        &参数, 
        &g_显卡设备
    );
    
    if (FAILED(hr)) {
        // 添加错误信息以便调试
        wchar_t errorMsg[256];
        swprintf_s(errorMsg, L"创建设备失败: HRESULT = 0x%08X", hr);
        MessageBox(g_hWnd, errorMsg, L"DX错误", MB_OK | MB_ICONERROR);
        return false;
    }
	设备能力 test;
	g_显卡设备->获取设备能力(&test);
    
    return SUCCEEDED(hr);
}

// 渲染帧
void 渲染() {
    if (!g_显卡设备) return;

    // 清屏为蓝色
    g_显卡设备->清空缓冲区(0, nullptr, 清除目标表面, 颜色_XRGB(0, 120, 255), 1.0f, 0);
    
    // 开始渲染
    if (SUCCEEDED(g_显卡设备->开始渲染())) {
        // 在此添加绘制代码
        
        g_显卡设备->结束渲染();
    }
    
    // 呈现到屏幕
    g_显卡设备->呈现画面(nullptr, nullptr, nullptr, nullptr);
}

// 清理资源
void 清理() {
    if (g_显卡设备) g_显卡设备->释放资源();
    if (g_显卡管理器) g_显卡管理器->释放资源();
}

// 主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
    if (!初始化窗口(hInstance, nCmdShow)) return 0;
    if (!初始化DX()) {
        MessageBox(nullptr, L"初始化中文DX失败", L"错误", MB_OK);
        return 0;
    }

    MSG msg = {0};
    while (msg.message != WM_QUIT) {
        if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        } else {
            渲染();
        }
    }

    清理();
    return 0;
}